<?php

namespace app\common\library;

use Exception;

/**
 * 图片处理类
 */
class ImageProcessor
{
    /**
     * 调整图片尺寸
     * @param string $url 图片URL（支持本地路径和远程URL）
     * @param int $width 目标宽度
     * @param int $height 目标高度
     * @return bool
     */
    public static function resizeImage($url, $width, $height)
    {
        try {
            $imagePath = '';
            $isRemoteImage = false;
            $tempFile = '';

            // 判断是本地文件还是远程文件
            if (strpos($url, 'http://') === 0 || strpos($url, 'https://') === 0) {
                // 远程图片：下载到临时文件
                $isRemoteImage = true;
                $tempFile = sys_get_temp_dir() . '/' . uniqid('remote_img_') . '.tmp';

                // 下载远程图片，支持HTTPS
                $context = stream_context_create([
                    'http' => [
                        'timeout' => 30,  // 30秒超时
                        'user_agent' => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
                        'follow_location' => true,
                        'max_redirects' => 5,
                    ],
                    'ssl' => [
                        'verify_peer' => false,
                        'verify_peer_name' => false,
                        'allow_self_signed' => true,
                    ]
                ]);

                $imageContent = file_get_contents($url, false, $context);
                if ($imageContent === false) {
                    return false;
                }

                // 保存到临时文件
                if (file_put_contents($tempFile, $imageContent) === false) {
                    return false;
                }

                $imagePath = $tempFile;
            } else {
                // 本地文件：构建完整路径
                $imagePath = ROOT_PATH . 'public' . $url;

                if (!file_exists($imagePath)) {
                    return false;
                }
            }

            // 获取图片信息
            $imageInfo = getimagesize($imagePath);
            if (!$imageInfo) {
                return false;
            }

            $originalWidth = $imageInfo[0];
            $originalHeight = $imageInfo[1];
            $imageType = $imageInfo[2];

            // 如果原图尺寸已经符合要求，不需要处理
            if ($originalWidth == $width && $originalHeight == $height) {
                return true;
            }

            // 创建原图资源
            switch ($imageType) {
                case IMAGETYPE_JPEG:
                    $sourceImage = imagecreatefromjpeg($imagePath);
                    break;
                case IMAGETYPE_PNG:
                    $sourceImage = imagecreatefrompng($imagePath);
                    break;
                case IMAGETYPE_GIF:
                    $sourceImage = imagecreatefromgif($imagePath);
                    break;
                case IMAGETYPE_BMP:
                    $sourceImage = imagecreatefrombmp($imagePath);
                    break;
                case IMAGETYPE_WEBP:
                    $sourceImage = imagecreatefromwebp($imagePath);
                    break;
                default:
                    return false;
            }

            if (!$sourceImage) {
                return false;
            }

            // 创建目标图片资源
            $targetImage = imagecreatetruecolor($width, $height);

            // 保持PNG和GIF的透明度
            if ($imageType == IMAGETYPE_PNG || $imageType == IMAGETYPE_GIF) {
                imagealphablending($targetImage, false);
                imagesavealpha($targetImage, true);
                $transparent = imagecolorallocatealpha($targetImage, 255, 255, 255, 127);
                imagefilledrectangle($targetImage, 0, 0, $width, $height, $transparent);
            }

            // 计算原图和目标图的宽高比
            $originalRatio = $originalWidth / $originalHeight;
            $targetRatio = $width / $height;

            // 计算缩放比例
            $scaleX = $width / $originalWidth;
            $scaleY = $height / $originalHeight;

            // 使用较大的缩放比例，确保完全填充目标尺寸
            $scale = max($scaleX, $scaleY);

            $newWidth = intval($originalWidth * $scale);
            $newHeight = intval($originalHeight * $scale);

            // 创建临时缩放图片
            $tempImage = imagecreatetruecolor($newWidth, $newHeight);

            // 保持透明度
            if ($imageType == IMAGETYPE_PNG || $imageType == IMAGETYPE_GIF) {
                imagealphablending($tempImage, false);
                imagesavealpha($tempImage, true);
                $transparent = imagecolorallocatealpha($tempImage, 255, 255, 255, 127);
                imagefilledrectangle($tempImage, 0, 0, $newWidth, $newHeight, $transparent);
            }

            // 先将原图缩放到临时图片
            imagecopyresampled(
                $tempImage,
                $sourceImage,
                0,
                0,
                0,
                0,
                $newWidth,
                $newHeight,
                $originalWidth,
                $originalHeight
            );

            // 计算裁剪位置
            if ($originalRatio > $targetRatio) {
                // 宽图片：宽度填满，高度从底部裁剪
                $cropX = 0;  // 宽度不裁剪
                $cropY = max(0, $newHeight - $height);  // 高度从底部裁剪，保留上半部分
            } else {
                // 高图片：从上下和左右的中间裁剪，保留真正中间的部分
                $cropX = intval(($newWidth - $width) / 2);   // 宽度居中裁剪
                $cropY = intval(($newHeight - $height) / 2); // 高度居中裁剪
            }

            // 从临时图片裁剪到目标图片
            imagecopyresampled(
                $targetImage,
                $tempImage,
                0,
                0,
                $cropX,
                $cropY,
                $width,
                $height,
                $width,
                $height
            );

            // 释放临时图片内存
            imagedestroy($tempImage);

            // 确定保存路径
            $savePath = $imagePath;
            if ($isRemoteImage) {
                // 远程图片：保存到原始URL对应的本地路径
                $savePath = ROOT_PATH . 'public' . $url;

                // 确保目录存在
                $saveDir = dirname($savePath);
                if (!is_dir($saveDir)) {
                    mkdir($saveDir, 0755, true);
                }
            }

            // 保存图片
            switch ($imageType) {
                case IMAGETYPE_JPEG:
                    $result = imagejpeg($targetImage, $savePath, 90);
                    break;
                case IMAGETYPE_PNG:
                    $result = imagepng($targetImage, $savePath, 9);
                    break;
                case IMAGETYPE_GIF:
                    $result = imagegif($targetImage, $savePath);
                    break;
                case IMAGETYPE_BMP:
                    $result = imagebmp($targetImage, $savePath);
                    break;
                case IMAGETYPE_WEBP:
                    $result = imagewebp($targetImage, $savePath, 90);
                    break;
                default:
                    $result = false;
            }

            // 释放内存
            imagedestroy($sourceImage);
            imagedestroy($targetImage);

            // 清理临时文件
            if ($isRemoteImage && $tempFile && file_exists($tempFile)) {
                unlink($tempFile);
            }

            return $result;
        } catch (Exception $e) {
            // 清理临时文件
            if (isset($tempFile) && $tempFile && file_exists($tempFile)) {
                unlink($tempFile);
            }

            // 记录错误日志
            \think\Log::error('图片裁剪失败: ' . $e->getMessage());
            return false;
        }
    }
}
